Estructuras de datos

Python posee además de los tipos de datos básicos, otros tipos de datos más complejos. Se trata de las tuplas, las listas y los diccionarios.

Estos tres tipos, pueden almacenar colecciones de datos de diversos tipos y se diferencian por su sintaxis y por la forma en la cual los datos pueden ser manipulados.


SECUENCIAS: TUPLAS Y LISTAS

Tanto las tuplas como las listas son conjuntos ordenados de elementos. Una tupla es una variable que permite almacenar datos inmutables (no pueden ser modificados una vez creados) de tipos diferentes. Las tuplas se encierran entre paréntesis.

  • Tienen longitud fija
  • Solo tiene una dimensión (*)

Una lista es similar a una tupla con la diferencia fundamental de que permite modificar los datos una vez creados. Las listas se encierran entre corchetes y además pueden ser de mútiples dimensiones



In [28]:
# Ejemplo de lista, los valores van entre corchetes
una_lista = [4, "Hola", 6.0, 99 ]
# Ejemplo de tupla, los valores van entre paréntesis
una_tupla = (4, "Hola", 6.0, 99)

print ("Lista: " , una_lista)
print ("Tupla: " , una_tupla)
# Las tuplas y las listas aceptan operadores de comparación y devuelven un booleano
print (una_lista == una_tupla)


Lista:  [4, 'Hola', 6.0, 99]
Tupla:  (4, 'Hola', 6.0, 99)
False

In [29]:
# una_lista = [4, "Hola", 6.0, 99 ]
# una_tupla = (4, "Hola", 6.0, 99)
# Uso del operador IN
4 in una_lista, 5 not in una_tupla


Out[29]:
(True, True)

In [30]:
# Uso de la función LEN, que nos dice cuantos elementos componen una lista o una tupla
len(una_lista), len(una_tupla)


Out[30]:
(4, 4)

In [31]:
# Uso de la funcion SORTED para ordenar los elementos de una lista/tupla
# Al ordenar la lista no la modifica, se crea una nueva; de ahí que tengamos que definir una variable para ejecutar la función
lista = [ 5, 6, 7, 1, 4, 2, 9 ]
otra = sorted(lista)
otra


Out[31]:
[1, 2, 4, 5, 6, 7, 9]


ACCESO A LOS ELEMENTOS DE UNA SECUENCIA

Los elementos de las secuencias pueden ser accedidos mediante el uso de corchetes [ ], como en otros lenguajes de programación. Podemos indexar las secuencias utilizando la sintaxis [<inicio>:<final>:<salto>].

En Python, la indexación empieza por CERO


In [32]:
lista = [5, 3, 1, 6, 99]
print(lista)
# Mostrar el primer elemento
print(lista[0])
# Mostrar el tercer elemento
print(lista[2])


[5, 3, 1, 6, 99]
5
1

In [33]:
# Uso de la sintaxis [<inicio>:<final>:<salto>]
lista = [2, 9, 6, 4, 3, 71, 1, 32, 534, 325, 2, 6, 9, 0]
print(lista)
# Muestra 3 elementos, comenzando por el elemento situado en la posición 3 y
# terminando en el de la posición 6, con saltos de 1 elementos
# [3,6) es como se expresa en notación científica, donde el corchete incluye y el paréntesis excluye
print(lista[3:6:1])
# Muestra todos los elementos, desde el primero hasta el último, con saltos de 2 elementos
print(lista[::2])
# Se puede acceder a los elementos de una secuencia de manera inversa
print ( lista[-1] )  # El último elemento
print ( lista[-2] )  # El penúltimo elemento


[2, 9, 6, 4, 3, 71, 1, 32, 534, 325, 2, 6, 9, 0]
[4, 3, 71]
[2, 6, 3, 1, 534, 2, 9]
0
9

Los elementos de las secuencias, tanto listas como tuplas, son hetereogéneos, así que es posible definir listas que contienen valores númericos y cadenas de caracteres, así como otras listas:


In [34]:
# Lista con valores heterogéneos
lista = ["A", 26, "lista", 9, -62]
lista2 = [1, 2, 3, 4]
lista3 = ["A", "B", "C", "D"]
# Lista que incluye otra lista, así como otros valores
lista4 = [lista2, [6, 98, "Abc"]]
print(lista4)


[[1, 2, 3, 4], [6, 98, 'Abc']]

In [35]:
# Acceder a los elementos de una lista que a su vez está incluida en otra lista (una matriz o array)
# [acceso a la lista][acceso a la posición de dicha lista]
d = lista4[1][2]
print(d)


Abc

In [36]:
# Lista simple o de 1 dimensión
matriz1 = [
            1, 2, 3,
            4, 5, 6,
            7, 8, 9,
]
# Acceso al elemento 3 de la lista
print("Valor A: ", matriz1[3])
# Lista de 3 dimensiones
matriz2 = [
            [1, 2, 3],
            [4, 5, 6],
            [7, 8, 9]
]
# Acceso al elemento 1 de la segunda lista
print("Valor B: ", matriz2[2][0])


Valor A:  4
Valor B:  7

En el caso de las listas, podemos modificar los datos almacenados:


In [37]:
lista = [1, 2, 3, 4]
print ( "Antes: ", lista)
lista[0] = 0.0
print ("Después: ", lista)


Antes:  [1, 2, 3, 4]
Después:  [0.0, 2, 3, 4]

In [38]:
print(matriz2)
matriz2[1] = [0,0,0]
matriz2


[[1, 2, 3], [4, 5, 6], [7, 8, 9]]
Out[38]:
[[1, 2, 3], [0, 0, 0], [7, 8, 9]]

In [4]:
# Con esta instrucción "matriz2.*?" nos muestra todas las posibilidades existentes: 
# matriz2.append
# matriz2.clear
# matriz2.copy
# matriz2.count
# matriz2.extend
# matriz2.index
# matriz2.insert
# matriz2.pop
# matriz2.remove
# matriz2.reverse
# matriz2.sort

# Por ejemplo para añadir una lista a otra lista mediante la instrucción append.
# Se puede añadir sólo un valor, no es necesario añadir una lista entera
matriz = [[1,2,3],[4,5,6],[7,8,9]]
matriz.append(['A','B','C'])
print(matriz)
matriz.append(5)
matriz


[[1, 2, 3], [4, 5, 6], [7, 8, 9], ['A', 'B', 'C']]
Out[4]:
[[1, 2, 3], [4, 5, 6], [7, 8, 9], ['A', 'B', 'C'], 5]

In [62]:
# Para quitar un elemento de la lista, se usa la instrucción remove
matriz.remove(5)
matriz


Out[62]:
[[1, 2, 3], [4, 5, 6], [7, 8, 9], ['A', 'B', 'C']]

Se pueden concatenar listas o tuplas mediante el operador +


In [66]:
# Ejemplo de concatenación de dos tuplas
# En el primer ejemplo se crea una tupla con dos tuplas concatenadas, definiendolas en la misma línea
tupla = (1,2,3) + ('a','b','c')
print(tupla)
# Creación de una tupla a partir de dos tuplas definidas previamente
tupla1 = (6,9,7,'abc')
tupla2 = (1,6,0,'def')
tupla_f = tupla1 + tupla2
tupla_f


(1, 2, 3, 'a', 'b', 'c')
Out[66]:
(6, 9, 7, 'abc', 1, 6, 0, 'def')

In [69]:
# Se pueden utilizar operadores matemáticos con las listas o tuplas
# A destacar que el uso de los operadores + y * no modifican las secuencias originales, sino que crean nuevas secuencias
tupla_m = tupla1 * 4
tupla_m


Out[69]:
(6, 9, 7, 'abc', 6, 9, 7, 'abc', 6, 9, 7, 'abc', 6, 9, 7, 'abc')


DESEMPAQUETAR TUPLAS

En muchos casos es interesante asignar nombre a los elementos de las tuplas para, posteriormente, trabajar con esas variables.


In [70]:
# Se define una tupla llamada "laborales"
laborales = (1, 2, 3, 4, 5 )
# Se define una variable llamada "laborales" con una serie de valores para dicha tupla
# La definición de la variable puede hacerse antes de los valores o despues de los valores
lunes, martes, miercoles, jueves, viernes = laborales
# Si preguntamos por un valor de dicha variable nos devolverá su correspondencia dentro de la tupla
martes


Out[70]:
2

Mostramos otro ejemplo con tuplas anidadas:


In [72]:
# Creamos una tupla llamada "dias" anidando dos tuplas, una ya existente ("laborales") y otra que creamos al anidar (6,7)
dias = laborales, (6, 7)
# El resultado es una tupla de tuplas
dias


Out[72]:
((1, 2, 3, 4, 5), (6, 7))

In [79]:
# Crea la variable "dias" a partir de la variable "laborales", añadiendo dos valores nuevos (sabado, domingo)
laborales, (sabado, domingo) = dias
sabado


Out[79]:
6


LISTAS: CASOS PARTICULARES

Como hemos dicho anteriormente, las listas pueden tener longitud variable y son mutables. También hemos visto que pueden definirse mediante [ ].

Otra forma de definir las listas es mediante la función list.


In [81]:
# Definimos una tupla
tupla = (3, 4, 5)
# Mediante la función "list" creamos una lista a partir de la tupla anterior
lista = list(tupla)
lista


Out[81]:
[3, 4, 5]

In [82]:
# Se puede modificar una lista especificando la posición a modificar y un valor
lista[0] = None     # valor nulo en Python
lista


Out[82]:
[None, 4, 5]

In [83]:
lista[0] = 3
lista


Out[83]:
[3, 4, 5]


AÑADIR Y ELEMINAR ELEMENTOS DE UNA LISTA

Aunque se pueden añadir elementos como hemos visto antes, la forma más eficiente es mediante el método append, que añade elementos al final de la lista. Otra forma de añadir elementos es mediante el método insert, que inserta un elemento en una determinada posición.


In [87]:
# Definimos una lista
lista = ['Lunes', 'Jueves']
print(lista)
# Mediante la instrucción "append(valor)" añadimos a dicha lista un valor
# Con append(valor) añadimos siempre el elemento al final de la lista
lista.append('Viernes')
print(lista)


['Lunes', 'Jueves']
['Lunes', 'Jueves', 'Viernes']

In [88]:
# La instrucción "insert(posición,valor)" es similar a append(valor), con la salvedad de que nos permite añadir el elemento
# en la posición que nostros queramos
lista.insert(1, 'Martes')
print(lista)
lista.insert(2, 'Miércoles')
print(lista)


['Lunes', 'Martes', 'Jueves', 'Viernes']
['Lunes', 'Martes', 'Miércoles', 'Jueves', 'Viernes']

La operación pop permite eliminar el elemento de la lista que ocupa una determinada posición.


In [89]:
# Para usar la instrucción "pop(posición)" hay que definir una variable que realice dicha operación
# En este ejemplo borramos la posición 3 "Jueves"
borrar = lista.pop(3)
borrar


Out[89]:
'Jueves'

In [90]:
# Verificamos que la lista ya no contiene el elemento "Jueves"
lista


Out[90]:
['Lunes', 'Martes', 'Miércoles', 'Viernes']

Pero puede darse el caso de que necesitemos eliminar un elemento de la lista y que no conozcamos la posición que ocupa. En esos casos utilizaremos el método remove.


In [91]:
lista.remove('Viernes')
lista


Out[91]:
['Lunes', 'Martes', 'Miércoles']


ORDENAR LISTAS

El método sort permite ordenar una lista sin necesidad de crear una lista nueva, por lo que la operación es muy eficiente.


In [97]:
# Definimos una lista
lista = [5,7,2,0,4,7,1,5,4,3,4,1,9,0]
# Mediante el método "sort()" ordenamos la lista
lista.sort()
# Con "remove()" eliminamos un elemento especificando entre paréntesis el primer valor a eliminar, en caso de que haya dos
# o más elementos igules en la lista. La diferencia con "pop(posición)" es que si la lista no está ordenada eliminamos el primer
# elemento que coincida, con pop() podemos eliminar un elemento concreto.
print(lista)
lista.remove(0)
lista


[0, 0, 1, 1, 2, 3, 4, 4, 4, 5, 5, 7, 7, 9]
Out[97]:
[0, 1, 1, 2, 3, 4, 4, 4, 5, 5, 7, 7, 9]


GENERAR LISTAS

Python 2.7 proporciona la función predefinida range(inicio, fin, paso) para generar listas automáticamente. En Python 3.5 no se genera una lista; se genera un objeto iterable.


In [99]:
# Se define la variable 'l' como un rango que empieza en 0, termina en 11 y va en saltos de 2
l = range(0,11,2)
# Después mediante la función list() creamos una lista de 'l'
list(l)


Out[99]:
[0, 2, 4, 6, 8, 10]

In [100]:
# Ejemplo desglosado, en este caso si no se especifica un paso, lo realiza de 1 en 1
# Variable y muestra del valor de dicha variable
l = range(-5, 5)
l


Out[100]:
range(-5, 5)

In [105]:
# Uso de list() para crear la lista de la variable 'l'
list(l)


Out[105]:
[-5, -4, -3, -2, -1, 0, 1, 2, 3, 4]


SECUENCIAS DE CARACTERES STR

Las cadenas son consideradas como una secuencia de caracteres y por tanto pueden ser tratadas como otras secuencias (tuplas o listas). Podemos acceder a cada uno de los caracteres de una cadena:


In [110]:
# Definimos una variable con un valor string
a = "Ana"
# Se considera que la cadena o string "Ana" es una secuencia de 3 posiciones, siendo:
# A --> posición 0
# n --> posición 1
# a --> posición 2
# Por tanto se puede acceder a cada uno de los caracteres que componen un string como si fueran elementos de una lista o tupla
a, a[0], a[2]


Out[110]:
('Ana', 'A', 'a')

In [115]:
# Los espacios no se tienen en cuenta
mensaje = "Vaya calor que hace"
mensaje[0], mensaje[12]


Out[115]:
('V', 'u')

In [116]:
# Las cadenas en Python son inmutables. Eso quiere decir que no es posible modificar una cadena sin crear otra nueva.
b = mensaje.replace('V', 'v')
b, mensaje


Out[116]:
('vaya calor que hace', 'Vaya calor que hace')

In [114]:
# Uso de len() para saber la longitud de la string como si fuera una lista o tupla
len(mensaje)


Out[114]:
19

In [ ]: